<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>构造函数的继承</title>
</head>
<body>
<script>
    // 一：ES5构造函数继承

    //未成年人的构造函数
    function minor(name, age, sex) {
        this.name = name;
        this.age = age;
        this.sex = sex
    }

    // 向原型对象添加方法
    minor.prototype.print = function () {
        console.log('我是\t' + this.name + '\n今年\t' + this.age + '\n性别\t' + this.sex + '\n我的电话\t' + this.phone)
    }

    //成年人构造函数
    function adult(name, age, sex, phone) {
        minor.call(this, name, age, sex);//call()方法--改变this的指向,继承父级(未成年)构造函数的属性赋值
        this.phone = phone;
    }

    //设置成年人构造函数的原型
    adult.prototype = new minor;//将父级(未成年人)原型地址赋值 -- 就有了父级的方法
    adult.prototype.constructor = adult//矫正原型是否相等

    //给子类(成年人)原型添加方法
    adult.prototype.playGame = function () {
        console.log('长大了有手机打游戏了！！')
    }
    //子类的实例化对象(成年人)
    let person = new adult('zhangSan', 19, '男', '1551863577')
    person.playGame();
    person.print();



    // 二：Class继承
    class Phone{
        //构造方法 名字是固定的不能修改
        constructor(brand,price,generations) {
            this.brand=brand;
            this.price=price;
            this.generations=generations
        }
        // 添加方法  必须使用改语法,不能使用 ES5 的对象形式
        print(){
            console.log(this.brand+this.generations+'版本'+this.price+'元'+'颜色是'+this.color)
        }
    }
    //继承父类
    class sonPhone extends Phone{
        //构造方法
        constructor(brand,price,generations,color) {
            super(brand,price,generations)
            this.color=color;
        }
        //给子代添加方法
        playGame(){
            console.log('可以用来打游戏！！')
        }
    }

    let phone=new sonPhone('OPPO',1999,'1.10.12','red')
    phone.playGame()
    phone.print()
</script>
</body>
</html>